package nutella89.basic;

import java.util.ArrayList;

public class J22_Generic {

	public static void main(String[] args) {
		// 컬렉션 프레임워크를 구성하는 핵심 기술
		// 흔히, 타입매개변수라고 불리우는 <E>,<K>,<V>등의
		// 다이아몬드 기호를 이용해서 컬렉션의 요소들을 [일반화]할 수 있음
		// 이것을 통해 엄격한 자료형 검사도 할 수 있고
		// 불필요한 형변환도 방지할 수 있음

		J22_Tiger tiger = new J22_Tiger();
		J22_Lion lion = new J22_Lion();
		J22_Zebra zebra = new J22_Zebra();

		ArrayList zoo = new ArrayList();

		zoo.add(tiger);
		zoo.add(lion);
		zoo.add(zebra);

		// 형변환을 해 줘야 들어감
		tiger = (J22_Tiger) zoo.get(0);

		lion = (J22_Lion) zoo.get(1);

		zebra = (J22_Zebra) zoo.get(2);
		
		//하지만, 아래의 문제가 발생할 수 있음!
		// 즉, 엄격한 자료형 검사를 컴파일 단계에서 하지 않았기 때문에 실행시 오류를 표시
		//zebra = (J22_Zebra) zoo.get(0);
		
		/*---------------------------------------------*/
		// <E> : element 배열 요소의 자료형 의미
		
		ArrayList<J22_Tiger> cage1 =new ArrayList<>();// JDK7
		ArrayList<J22_Lion> cage2 =new ArrayList<>();
		ArrayList<J22_Zebra> cage3 =new ArrayList<J22_Zebra>();
		
		cage1.add(tiger);
		tiger =cage1.get(0);
		//불필요한 type casting 제거
		
		//cage2.add(tiger);
		//lion=cage1.get(0);
		//컴파일시점에 자료형 불일치로 표시
		//cage3.add(tiger);
		
		

	}

}

class J22_Tiger {
	public void howl() {
		System.out.println("호랑이가 울어요");
	}
}

class J22_Lion {
	public void howl() {
		System.out.println("사자가 울어요");
	}
}

class J22_Zebra {
	public void howl() {
		System.out.println("얼룩말이 울어요");
	}
}